package com.jingdianjichi.subject.infra.basic.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.util.Date;

/**
 * subject es
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
//告诉Spring Data Elasticsearch不要自动创建这个索引。如果不设置为false，当应用启动的时候，如果这个索引不存在，那么会自动创建这个索引
@Document(indexName = "subject_index", createIndex = false)
public class SubjectInfoEs2 {

    @Field(type = FieldType.Long) //指定字段在es中的数据类型为Long
    @Id //@Id注解用于标记实体类中的字段作为Elasticsearch文档的唯一标识符。通常情况下，这个字段会被映射到Elasticsearch索引中的_id字段。
    private Long id;

    //当你将一个字段设置为text类型时，Elasticsearch会使用分析器（analyzer）对文本进行分词。
    // 这意味着文本会被拆分成一个个的词（tokens），并且每个词都会被单独索引。
    //适合用于全文搜素场景
    @Field(type = FieldType.Text, analyzer = "ik_smart")
    private String subjectName;

    @Field(type = FieldType.Text, analyzer = "ik_smart")
    private String subjectAnswer;

    //keyword类型的字段不会被分词，而是作为一个整体来索引。这意味着你可以进行精确匹配查询
    @Field(type = FieldType.Keyword)
    private String createUser;

    //表示该字段不会被索引。这意味着你不能通过这个字段进行搜索，但它仍然可以被存储和检索。
    /*
        为什么使用 index = false?
        性能优化：如果你不需要对某个字段进行搜索，将其设置为index = false可以减少索引的大小，从而提高索引和查询的性能。
        节省存储空间：不索引的字段不会占用额外的存储空间来存储倒排索引信息。
        数据完整性：某些字段可能包含敏感信息或冗余信息，你不希望它们出现在搜索结果中。
     */
    @Field(type = FieldType.Date, index = false)
    private Date createTime;
}
